"""
15-23年广东接待各外国游客的动态柱状图
专门适配宽格式Excel表格（国别+年份列）
"""
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType
import pandas as pd
from pyecharts.commons.utils import JsCode

# Excel文件路径
excel_file_path = r"C:\Users\Lenovo\OneDrive\桌面\数据\15-23年广东接待各外国的游客.xls"

try:
    # 1. 读取Excel文件 - 跳过前两行空行，从第3行开始读取（数据实际开始行）
    print("正在读取Excel文件...")
    
    # 跳过前2行空行，从第3行开始读取（包含列名）
    df = pd.read_excel(excel_file_path, skiprows=1, header=0, engine='xlrd')
    
    print("读取到的原始列名:", df.columns.tolist())
    print("数据形状:", df.shape)
    
    # 2. 数据清洗 - 重命名列名为年份
    # 您的表格列名应该是：['国别', 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023]
    new_columns = ['country']  # 第一列是国别
    
    # 为后面的列添加年份名称
    for i in range(1, len(df.columns)):
        if i <= 9:  # 2015-2023共9年
            year = 2014 + i
            new_columns.append(str(year))
        else:
            new_columns.append(f'col_{i}')
    
    df.columns = new_columns
    print("重命名后的列名:", df.columns.tolist())
    
    # 3. 数据处理 - 转换为时间序列格式
    data_dict = {}
    excluded_countries = ['总计', '其他']  # 需要排除的行
    
    for index, row in df.iterrows():
        country = str(row['country']).strip()
        
        # 跳过需要排除的国家
        if country in excluded_countries or pd.isna(country):
            continue
        
        # 处理每个年份的数据
        for year in range(2015, 2024):  # 2015到2023
            year_col = str(year)
            visitors = row[year_col]
            
            # 跳过空值
            if pd.isna(visitors):
                continue
            
            # 确保是数值类型
            try:
                visitors = float(visitors)
            except (ValueError, TypeError):
                continue
            
            # 存储到数据结构中
            if year not in data_dict:
                data_dict[year] = []
            data_dict[year].append([country, visitors])
    
    print(f"数据处理完成，共处理{len(data_dict)}个年份的数据")
    
    # 显示每个年份的数据统计
    for year in sorted(data_dict.keys()):
        count = len(data_dict[year])
        total_visitors = sum([x[1] for x in data_dict[year]])
        print(f"  {year}年: {count}个国家, 总游客量: {total_visitors:,.0f}人次")
    
    # 4. 生成动态柱状图
    timeline = Timeline({
        "theme": ThemeType.LIGHT,
        "width": "1400px",  # 增加宽度以适应长国家名称
        "height": "800px"
    })
    
    # 按年份排序
    sort_year_list = sorted(data_dict.keys())
    
    for year in sort_year_list:
        # 对每个国家的游客数量进行排序（从大到小）
        yearly_data = data_dict[year]
        yearly_data.sort(key=lambda x: x[1], reverse=True)
        
        # 取前15个国家（您的数据中国家较多）
        top_countries = yearly_data[:15]
        
        # 准备数据
        countries = [item[0] for item in top_countries]
        visitors = [item[1] for item in top_countries]
        
        # 创建横向柱状图
        bar = Bar()
        
        # 为了显示效果，将数据反转（最大的在顶部）
        countries.reverse()
        visitors.reverse()
        
        bar.add_xaxis(countries)
        bar.add_yaxis("游客数量", visitors, 
                     label_opts=LabelOpts(
                         position="right", 
                         formatter="{c}",
                         font_size=10
                     ))
        
        # 设置为横向柱状图
        bar.reversal_axis()
        
        # 设置图表配置
        bar.set_global_opts(
            title_opts=TitleOpts(
                title=f"{year}年广东接待外国游客数量TOP15",
                title_textstyle_opts=TextStyleOpts(font_size=16)
            ),
            tooltip_opts=TooltipOpts(formatter="{b}: {c} 人次"),
            xaxis_opts=AxisOpts(
                name="游客数量（人次）",
                axislabel_opts=LabelOpts(formatter="{value}")
            ),
            yaxis_opts=AxisOpts(
                name="国家/地区",
                axislabel_opts=LabelOpts(font_size=10)
            ),
            datazoom_opts=DataZoomOpts(
                type_="inside",  # 内置型数据区域缩放
                range_start=0,
                range_end=100
            )
        )
        
        # 添加到时间线
        timeline.add(bar, str(year))
        print(f"已添加{year}年图表")
    
    # 设置时间线自动播放
    timeline.add_schema(
        play_interval=1000,  # 播放间隔1秒
        is_timeline_show=True,
        is_auto_play=True,
        is_loop_play=True,
        pos_left="10%",
        pos_right="10%"
    )
    
    # 渲染为HTML文件
    html_output = "2015-2023年广东接待外国游客动态柱状图.html"
    timeline.render(html_output)
    
    print(f"\n 动态柱状图已成功生成：{html_output}")
    print(f" 包含年份: {sort_year_list}")
    print(" 打开生成的HTML文件查看交互式图表！")
    
except Exception as e:
    print(f"处理过程中出错：{str(e)}")
    import traceback
    traceback.print_exc()

    # 提供详细的调试信息
    print("\n 调试信息:")
    try:
        # 尝试读取文件前几行来诊断问题
        test_df = pd.read_excel(excel_file_path, nrows=5, header=None, engine='xlrd')
        print("文件前5行内容:")
        print(test_df)
    except Exception as debug_e:
        print(f"调试读取失败: {debug_e}")